﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using Model;
using Interfaces;
using System.Collections;

namespace Controller
{
    public class Produktionssystem
    {
        private VareCollection vareCol;
        private OrdreCollection ordreCol;
        private TavleCollection tavleCol;
        private Vare aktuelVare;

        private DBFacade dbFacade;
        private Ordre AktuelOrdre = null;

        // Konstruktør
        public Produktionssystem()
        {
            vareCol = new VareCollection();
            ordreCol = new OrdreCollection();
            tavleCol = new TavleCollection();
            dbFacade = new DBFacade(this);

            fyldVareCol(true, true);
        }

        public void fyldVareCol(bool f, bool r)
        {
            if(f)
                IndlaesFaerdigvare();     
            if(r)
                IndlaesRaavarer();
        }

        //JIM : Henter alle salgsordre fra databasen til ordreCol
        public void HentAlleSalgsOrdre() { dbFacade.HentAlleSalgsOrdre(); }

        //JIM kaldes fra dbFacade.HentAlleSalgsOrdre() og fylder ordreCol med salgsordre
        public void TilfoejOrdre(DateTime leveringsdato, DateTime dato, bool klar)
        {
            ordreCol.OpretSalgsOrdre(leveringsdato, dato, klar); //kundenr??
        }
        
        internal void OpretRaavareModel(int raavarenr, string betegnelse, double kilo, string location, double minbeholdning)
        {
            Raavare raavare = vareCol.TilføjVare(raavarenr, betegnelse, kilo, location, minbeholdning);
         //   raavare.ModtagRaavarer(kilo);
        }

        //MADS //EDIT JIM
        internal void OpretFaerdigvareModel(int varenr, string betegnelse, double kilo, double indkoebspris, string location, int raavarenr)
        {    
            vareCol.TilfoejfaerdigVare(raavarenr, betegnelse, kilo, location, indkoebspris, varenr);
        }


        // OPERATIONER PÅ RAAVARE ///////////////////////////////

        // Pre: varenr findes ikke i systemet
        // Post: True returneret, hvis vareoprettelse lykkedes, ellers false (systemfejl)
        public bool TilføjRaavare(int raavarenr, string betegnelse, double kilo, string location, double minbeholdning)
        {
            if (dbFacade.OpretRaavare(raavarenr, betegnelse, kilo, location, minbeholdning))        // opret i databasen
            {
                vareCol.TilføjVare(raavarenr, betegnelse, kilo, location, minbeholdning);         // opret i modellen
                return true;
            }
            else
            return false;
        }


        //Tjek om Råvare-NR eksistere i forvejen!!!
        public IEnumerator GetRaavareEnumerator()
        {
            return vareCol.GetRaavareIterator();
        }

        //Tjek om Vare-NR eksistere i forvejen!!!
        public bool EksistererFaerdigvare(int varenr)
        {
            bool eksisterer = vareCol.EksistererFaerdigvare(varenr);
            return eksisterer;
        }

        ///////////////////////////////////////////////////// OPERATIONER PÅ INDKØBSORDRE ///////////////////////////////////////////////////////////

        // AØ - Opretter en indkøbsordre
        public bool OpretIndkoebsordre(DateTime leveringsdato)
        {
            if (dbFacade.OpretIndkoebsordre(leveringsdato))        // opret i databasen
            {
                ordreCol.OpretIndkoebsOrdre(leveringsdato);         // opret i modellen
                AktuelOrdre = ordreCol.OpretIndkoebsOrdre(leveringsdato);
                return true;
            }
            else
            {
                return false;
            }
            
        }

        //MADS - OPRET SALGSORDRE
        public bool OpretSalgsordre(int kundenr, DateTime dato, DateTime leveringsdato)
        {
            bool ordreklar = false;
            if (dbFacade.OpretSalgsOrdre(kundenr, dato, leveringsdato, ordreklar))       // opret i databasen
            {
                AktuelOrdre = ordreCol.OpretSalgsOrdre(dato, leveringsdato, ordreklar);         // opret i modellen
                return true;
            }
            else
            {
                return false;
            }
        }

        //MADS - REGISTRERING AF ORDRELINIER TIL EN ORDRE
        public bool RegistrerOrdreLinie(int ordrenr, int varenr, int raavarenr, double kilo, bool type)
        {
            // ordrelinier til indkøbsordre
            if (dbFacade.RegistrerOrdrelinie(ordrenr, raavarenr, kilo) && type == true) 
            {
                dbFacade.JusterRaavareKilo(varenr, kilo);
                Vare aktuelraavare = vareCol.FindVare(varenr);
                AktuelOrdre.RegistrerOrdreLinie(aktuelraavare, kilo);
                return true;
            }
           
            //ordrelinier til salgsordre
            if (dbFacade.RegistrerSalgsOrdrelinie(ordrenr, varenr, raavarenr, kilo) && type == false)
            {
                dbFacade.NedjusterRaavarekg(kilo, raavarenr);
                aktuelVare = vareCol.FindFaerdigvare(varenr);
                ordreCol.RegistrerOrdrelinie(aktuelVare, kilo);
                return true;
            }
            else
            {
                return false;
            }
        }

        //FindRåvareNummer 
        public int FindRaavarenumre(int i)
        {
            return vareCol.RAAVARER[i].VARENR;
        }

        //FindMangelsvareNummer
        public int FindMangelvarenumre(int i)
        {
            return vareCol.MANGELVARER[i].VARENR;
        }

        //FindMangelvareBetegnelse
        public String FindMangelvareBetegnelse(int i)
        {
            return vareCol.MANGELVARER[i].BETEGNELSE;
        }

        //FindRaaVareBetegnelse
        public String FindRaaVareBetegnelse(int i)
        {
            return vareCol.RAAVARER[i].BETEGNELSE;
        }

        //FindFaerdigVareBetegnelse
        public String FindFaerdigVareBetegnelse(int i)
        {
            return vareCol.FAERDIGVARER[i].BETEGNELSE;
        }

        //AntalFaerdigVareIVareCol
        public int AntalFaerdigVareIVareCol()
        {
            return vareCol.FaerdigvarerANTAL;
        }

        //AntalRaaVareIVareCol
        public int AntalRaaVareIVareCol()
        {
            return vareCol.RaavarerANTAL;
        }

        //AntalMangelvareIVareCol
        public int AntalMangelvareIVareCol()
        {
            return vareCol.MANTAL;
        }

        //FindFaerdigvarenumre
        public int FindFaerdigvarenumre(int i)
        {
            return vareCol.FAERDIGVARER[i].FAERDIGVARENR;
        }

        //findMangelvarer
        public void findMangelvarer()
        {
            vareCol.MANGELVARER.Clear();
            dbFacade.findMangelvarer("Mangelvarer");
        }

        //JESPER - Slet Råvare!
        public bool SletVare(int raavareNr)
        {
            if (dbFacade.SletVare(raavareNr))
            {
                vareCol.FjernVare(raavareNr);
                return true;
            }
            return false;
        }


        public void opretMangelVare(int raavarenr, string betegnelse, double kilo, string location, double indkoebspris)
        {
            vareCol.TilfoejMangelVare(new Raavare(raavarenr, betegnelse, kilo, location, indkoebspris));
        }

        public bool TilfoejFaerdigvare(int varenr, string betegnelse, double kilo, double indkoebspris, string location, int raavarenr)
        {
            if (dbFacade.OpretFaerdigvare(varenr, betegnelse, kilo, indkoebspris, location, raavarenr))
            {
                 vareCol.TilfoejFaerdigVare(new Færdigvare(varenr, betegnelse, kilo, location, indkoebspris, raavarenr));
                 return true;
            }
            else
            {
                return false;
            }
        }

        public void findFaerdigvarer()
        {
            dbFacade.findMangelvarer("Faerdigvarer"); 
        }

        public void IndlaesRaavarer()
        {
            vareCol.RAAVARER.Clear();
            dbFacade.IndlaesRaavarer();
        }

        public void IndlaesFaerdigvare()
        {
            vareCol.FAERDIGVARER.Clear();
            dbFacade.IndlaesFaerdigVare();
        }

        public int FindNytOrdrenr()
        {
            int sidsteordrenr = dbFacade.FindNytOrdrenummer();
            return sidsteordrenr;
        }

        //MADS - find ordrenr salg
        public int FindNytOrdreNrSalg()
        {
            int sidstesalgsordrenr = dbFacade.FindNytOrdreNrSalg();
            return sidstesalgsordrenr;
        }

        // AØ
        public int FindRaavareFraFaerdigvare(int varenr)
        {
            int raavarenr = dbFacade.FindRaavareFraFaerdigvare(varenr);
            return raavarenr;
        }

        public int Antal(int tavleId)
        {
            int antal = tavleCol.ANTAL(tavleId);
            return antal;
        }

        //-------------------------------------------------------------------------------------------//
        //                                           til tavler
        //-------------------------------------------------------------------------------------------/

        public void OpdaterTavler()
        {
            if (hentSalgsOrdreLinieID() == -1) { }//Der er ingen ordrelinier til tavlen
            else
            {
                List<Object> Salgsordrelinietavle = hentSuperListe();

                opdaterSuperListe(hentSalgsOrdreLinieID());
                TilfoejTilProduktionsliste(Salgsordrelinietavle);
            }
        }
        public void ClearTavler()
        {
            tavleCol.ClearListe(1);
            tavleCol.ClearListe(2);
            tavleCol.ClearListe(3);
            tavleCol.ClearListe(4);
        }


        //JIM - FORDELER PRODUKTIONSLINIER UD PÅ TAVLER
        public void TilfoejTilProduktionsliste(List<Object> Salgsordrelinietavle) 
        {
            

            for (int i = 0; i < Salgsordrelinietavle.Count; i++)
            {
                

                List<Object> IDogBeskr = (List<Object>)Salgsordrelinietavle[i]; // ಠ_ಠ
                int SalgsOrdreLinieID = Convert.ToInt32( IDogBeskr[0]);  //0 = ID, 1 = tavleID
                ProduktionsLinie PL = tavleCol.OpretProduktionsLinie(Convert.ToInt32(hentSalgsOrdreLinie(SalgsOrdreLinieID)[0]), HentLeveringsDato(), hentVareBet(Convert.ToInt32(hentSalgsOrdreLinie(SalgsOrdreLinieID)[2])), Convert.ToDouble(hentSalgsOrdreLinie(SalgsOrdreLinieID)[4]), HentRaavareBet(Convert.ToInt32(hentSalgsOrdreLinie(SalgsOrdreLinieID)[3]))[0], HentRaavareBet(Convert.ToInt32(hentSalgsOrdreLinie(SalgsOrdreLinieID)[3]))[1]);

                switch (Convert.ToInt32(IDogBeskr[1]))
                {
                    case 1:
                        tavleCol.TilfoejTilOpskaeringsListe(PL);
                        //tavleCol.TilfoejTilPakkeListe(PL);    
                        break;
                    case 2:
                        tavleCol.TilfoejTilHakkeListe(PL);
                        break;
                    case 3:
                        tavleCol.TilfoejTilFryseListe(PL);
                        break;
                    case 4:
                        tavleCol.TilfoejTilPakkeListe(PL);
                        break;
                }
            }
        }

        public List<ProduktionsLinie> HentProduktionsListe(int tavleID)
        {
            return tavleCol.HentProduktionsListe(tavleID);
        }

        private String[] HentRaavareBet(int id)
        {
            return dbFacade.HentRaavareBet(id);
        }

        
        private String[] hentSalgsOrdreLinie(int salgsordrelinieID)
        {
            return dbFacade.HentSalgsOrdreLinie(salgsordrelinieID);
        }

        private int hentSalgsOrdreLinieID() { return dbFacade.HentLavesteSalgsOrdreLinieID(); }
       
        private string hentVareBet(int varenr) { return dbFacade.HentVareBet(varenr); }

        private DateTime HentLeveringsDato() { return dbFacade.HenLevDato(); }
        
        private List<Object> hentSuperListe(){ return tavleCol.HentSuperListe(); }

        //JIM LIG SALGSORDRELINIER I vareCol's SUPER LISTE
        private void opdaterSuperListe(int salgsordrelinieID) 
        {
           
            int slgs = salgsordrelinieID;   //salgsordrelinieID

            while (dbFacade.HentOrdrelinieIDogTavleID(salgsordrelinieID).Count != 0)
            {
                tavleCol.TilfoejTilSuperListe(dbFacade.HentOrdrelinieIDogTavleID(salgsordrelinieID));
                salgsordrelinieID++;
            }
        }

        //MADS - HENT NYESTE SALGSORDRELINIE ID
        public int HentNyesteSalgsOrdreLinieId()
        {
            int nyestesalgsordrelinieid = dbFacade.HentNyesteSalgsOrdreLinieId();
            return nyestesalgsordrelinieid;     
        }

        //MADS - Regstrier salgsordrelinieid og tavleid i regtiltavle tabellen
        public void RegistrerTilTavler(int tavleid)
        {
            int salgsordrelinieid = HentNyesteSalgsOrdreLinieId();
            dbFacade.RegistrerTilTavler(salgsordrelinieid, tavleid);
        }

        // AØ - Slet ordrelinie ved færdigmeldelse
        public void LinieFaerdig(int salgsordrelinieId, int tavleid)
        {
            dbFacade.SletLinie(salgsordrelinieId, tavleid); 
        }

        // AØ - Slet ordrelinie ved færdigmeldelse og ret tavleId
        public void AendreLinieStatus(int salgsordrelinieId, int tavleid)
        {
            dbFacade.RegistrerTilTavler(salgsordrelinieId, tavleid);
        }

        //MADS - CLEAR LISTER
        public void ClearListe(int tavleid)
        {
            tavleCol.ClearListe(tavleid);
        }
    }
}
